#Requires AutoHotkey v2.0
; 这里至关重要，必须设置绝对屏幕，否则找色会失效
; 这里至关重要，必须设置绝对屏幕，否则找色会失效
; 这里至关重要，必须设置绝对屏幕，否则找色会失效
; 这里至关重要，必须设置绝对屏幕，否则找色会失效
; 这里至关重要，必须设置绝对屏幕，否则找色会失效
; 这里至关重要，必须设置绝对屏幕，否则找色会失效
; 这里至关重要，必须设置绝对屏幕，否则找色会失效
CoordMode "Pixel", "Screen"  ; 设置屏幕绝对坐标

/* 
脚本说明：
1. 符号说明：
   - ~ 表示不屏蔽原按键事件
   - $ 前缀防止循环触发
   - {Blind} 保留修饰键状态（如Shift/Ctrl等）

2. 功能特点：
   - 右键按下后330ms自动输入 [
   - 按下 ] 键时立即完成一次完整的按键循环
   - 两套逻辑独立运行互不干扰

3. 特殊处理：
   - ] 键使用 Down/Up 分离控制确保可靠触发
   - 10ms 短暂延迟模拟自然按键过程
   - 支持所有修饰键组合（如Shift+] 仍有效）
*/


/* ; 原有功能：右键延迟触发 [   屏息
~RButton:: {
    Sleep(330)
    Send("[")
} */

; 新功能：即时响应 ] 键  手电筒爆闪
; $]:: {
;     Send("{Blind}{] Down}")  ; 保持原始按键状态
;     Sleep(10)  ; 维持短暂按下状态
;     Send("{] Up}")
; }

; 新功能：9键触发0和9序列 一键开关手电
$9:: {
    Send("9")         ; 发送9键
    Sleep(500)        ; 等待300ms
    Send("0")         ; 立即发送0键
    Sleep(600)        ; 等待300ms
    Send("9")         ; 发送9键
}


/*
  DeepSeek:  写的不错，有两个需要改的地方：
第一个地方，需要把当我在300ms内连续按两次鼠标左键，自动帮我按键：] 的需求，给改成连续按2次右键
第二个地方，原有的功能：当我按下一次鼠标右键时候，延迟330毫秒后，自动帮助我按下 [ 键，该功能保留（连按2次右键时无需帮我按[键）

实现功能：按一次右键屏息；快速按两次右键开爆闪。
*/


; 全局变量初始化
global g_TimerActive := false
global g_LastRightClick := 0

; 右键处理主逻辑
~RButton::
{
    global g_TimerActive, g_LastRightClick
    
    if (g_TimerActive) {
        ; 使用函数引用代替字符串
        SetTimer(SendLeftBracket, 0)
        g_TimerActive := false
        
        if (A_TickCount - g_LastRightClick < 300) {
            Send("]")
            return
        }
    }
    
    g_LastRightClick := A_TickCount
    g_TimerActive := true
    ; 正确的函数引用传递方式
    SetTimer(SendLeftBracket, -330)
}

; 定时器回调函数
SendLeftBracket() {
    global g_TimerActive
    Send("[")
    g_TimerActive := false
}


; 显示/隐藏任务栏
; 全局变量跟踪任务栏状态
TaskbarVisible := true

; 快捷键：Ctrl + Alt + H 切换隐藏/显示
^!h:: {
    global TaskbarVisible
    if TaskbarVisible {
        ; 隐藏主任务栏和多显示器任务栏
        WinHide("ahk_class Shell_TrayWnd")
        ; WinHide("ahk_class Shell_SecondaryTrayWnd")
    } else {
        ; 显示主任务栏和多显示器任务栏
        WinShow("ahk_class Shell_TrayWnd")
        ; WinShow("ahk_class Shell_SecondaryTrayWnd")
    }
    TaskbarVisible := !TaskbarVisible  ; 切换状态
}







; 爆闪自动监测系统
; 当我按下 / 键时，进入一次持续20秒的监听。监听开始时有个系统音效（什么音效都可以）。在监听中，如果检测到按下了鼠标左键，就立刻帮我按下]键。按下]键之后，监听立刻结束（不用等待20秒就结束），结束时候播放一个系统音效（区别于开始音效）

; 需要注意：
; 1、结束监听方式有两个，一个是正常20秒结束，另一个是按下]键之后，监听立刻结束。
; 2、使用AHK2.0的语法
; 3、如果我重复按下了 / 键，则重置监听计时器，播放监听开始音效

global gListenerActive := false

; ==============================
; 只有检测到主武器在手，才会触发该系统（找色）
; ==============================

global CHECK_COLOR1 := "0x00DB9C"  ; #00DB9C的RGB格式
global CHECK_POS_X1 := 846        ; 检测点X坐标
global CHECK_POS_Y1 := 946        ; 检测点Y坐标
global variation1 := 56          ; 70% 偏差（计算方法：255 * 0.7 ≈ 178）

CheckColorCondition(CHECK_POS_X1, CHECK_POS_Y1, CHECK_COLOR1, variation1) {
    ; PixelGetColor &detectedColor, CHECK_POS_X1, CHECK_POS_Y1

    PixelSearch &foundX, &foundY, CHECK_POS_X1, CHECK_POS_Y1, CHECK_POS_X1, CHECK_POS_Y1, CHECK_COLOR1, variation1

    ; 判断结果
    if (foundX = CHECK_POS_X1 && foundY = CHECK_POS_Y1) {
        ; MsgBox "颜色匹配（允许70%偏差）"
        return true
    } else {
        ; MsgBox "颜色不匹配"
        ; return true
    }
    
    
    
    ; return (detectedColor = CHECK_COLOR1)
}


/:: {  ; 斜杠热键
    if (CheckColorCondition(CHECK_POS_X1, CHECK_POS_Y1, CHECK_COLOR1, variation1)) {
        if gListenerActive {  ; 如果已处于监听状态
            SetTimer(TimerProc, -20000)  ; 重置倒计时
            SoundPlay "*64"   ; 重新播放开始音效（系统通知音）
        } else {
            StartListener()  ; 首次启动监听
        }
    }
}

StartListener() {
    global gListenerActive := true
    SoundPlay "*64"  ; 开始音效（系统通知音）
    SetTimer(TimerProc, -20000)  ; 设置20秒计时器
}

StopListener() {
    global gListenerActive := false
    SetTimer TimerProc, 0     ; 关闭计时器
    SoundPlay "*16"            ; 结束音效（系统感叹号音）
}

TimerProc() {  ; 自然超时回调
    if gListenerActive {
        StopListener()
    }
}



; ; 一键夺舍（除了背包之外）
; SetDefaultMouseSpeed 0
; CoordMode "Mouse", "Screen"

; P:: {
;     static isRunning := false
;     if isRunning
;         return
    
;     isRunning := true
;     Critical true
    
;     ; 步骤1：按下`键
;     Send "``"
;     Sleep 100  ; 增加初始延迟
    
;     ; 步骤2：打开盒子（超慢版）
;     MouseMove 1207, 395, 100  ; 最慢移动速度
;     Sleep 100  ; 移动后长停顿
;     Click
;     Sleep 300
    
;     ; 步骤3：拿取副武器（原子级慢速拖动）
;     MouseMove 1424, 276
;     Sleep 30    ; 按下后长延迟
;     Click "Down"  ; 手动按下
;     ; 分10段完成拖动
;     Loop 5 {
;         MouseMove 1424-(A_Index*140), 276+(A_Index*40), 30
;         Sleep 30  ; 每小段延迟
;     }
;     Sleep 30
;     Click "Up"
;     Sleep 30
    
    
;     ; 步骤5：拿取行动报酬（原子级慢速点击）
;     MouseMove 1802, 895, 30
;     Sleep 30
;     Click "Down"
;     Sleep 30
;     Click "Up"
;     Sleep 300

;     ; 步骤6：下拉准备拿胸挂（原子级慢速拖动）
;     MouseMove 1700, 983
;     Sleep 30
;     Click "Down"
;     Loop 5 {
;         MouseMove 1700-(A_Index*36), 983-(A_Index*20), 30
;         Sleep 30
;     }
;     Sleep 30
;     Click "Up"
;     Sleep 30

;     ; 步骤7：拿取胸挂（原子级慢速拖动）
;     MouseMove 1298, 930
;     Sleep 200
;     Click "Down"
;     Sleep 300
;     Loop 5 {
;         MouseMove 1298-(A_Index*152), 930-(A_Index*2), 30
;         Sleep 30
;     }
;     Sleep 30
;     Click "Up"
;     Sleep 30

;     ; 步骤8：垂直拖动1（原子级慢速）
;     MouseMove 1183, 818
;     Sleep 30
;     Click "Down"
;     Loop 5 {
;         MouseMove 1183-(A_Index*1), 818-(A_Index*160), 30
;         Sleep 30
;     }
;     Sleep 30
;     Click "Up"
;     Sleep 30

;     ; 步骤9：垂直拖动2（原子级慢速）
;     MouseMove 1700, 943
;     Sleep 30
;     Click "Down"
;     Loop 5 {
;         MouseMove 1700-(A_Index*1), 943-(A_Index*184), 30
;         Sleep 30
;     }
;     Sleep 30
;     Click "Up"
;     Sleep 30

;     MouseMove 1288, 691
    
;     isRunning := false
;     Critical false
;     SoundBeep 1500, 200
; }




; ; 一键夺舍（空手全拿）
; SetDefaultMouseSpeed 0
; CoordMode "Mouse", "Screen"

; RControl:: {
;     static isRunning := false
;     if isRunning
;         return
    
;     isRunning := true
;     Critical true
    
;     ; 步骤1：按下`键
;     Send "``"
;     Sleep 100  ; 增加初始延迟
    
;     ; 步骤2：打开盒子（超慢版）
;     MouseMove 1207, 395, 100  ; 最慢移动速度
;     Sleep 100  ; 移动后长停顿
;     Click
;     Sleep 300
    
;     ; 步骤3：拿取副武器（原子级慢速拖动）
;     MouseMove 1424, 276
;     Sleep 30    ; 按下后长延迟
;     Click "Down"  ; 手动按下
;     ; 分10段完成拖动
;     Loop 5 {
;         MouseMove 1424-(A_Index*140), 276+(A_Index*40), 30
;         Sleep 30  ; 每小段延迟
;     }
;     Sleep 30
;     Click "Up"
;     Sleep 30
    
    
;     ; 步骤5：拿取行动报酬（原子级慢速点击）
;     MouseMove 1802, 895, 30
;     Sleep 30
;     Click "Down"
;     Sleep 30
;     Click "Up"
;     Sleep 300

;     ; 步骤6：下拉准备拿胸挂（原子级慢速拖动）
;     MouseMove 1700, 983
;     Sleep 30
;     Click "Down"
;     Loop 5 {
;         MouseMove 1700-(A_Index*36), 983-(A_Index*40), 30
;         Sleep 30
;     }
;     Sleep 30
;     Click "Up"
;     Click "Down"
;     Sleep 30
;     Click "Up"
;     Sleep 30

;     ; 步骤7：拿取胸挂（原子级慢速拖动）
;     MouseMove 1298, 930
;     Sleep 500
;     Click "Down"
;     Loop 5 {
;         MouseMove 1298-(A_Index*152), 930-(A_Index*2), 30
;         Sleep 30
;     }
;     Sleep 30
;     Click "Up"
;     Sleep 30

;     ; 步骤8：垂直拖动1（原子级慢速）
;     MouseMove 1183, 818
;     Sleep 30
;     Click "Down"
;     Loop 5 {
;         MouseMove 1183-(A_Index*1), 818-(A_Index*160), 30
;         Sleep 30
;     }
;     Sleep 30
;     Click "Up"
;     Sleep 30

;     ; 步骤9：垂直拖动2（原子级慢速）
;     MouseMove 1700, 943
;     Sleep 30
;     Click "Down"
;     Loop 5 {
;         MouseMove 1700-(A_Index*1), 943-(A_Index*184), 30
;         Sleep 30
;     }
;     Sleep 30
;     Click "Up"
;     Sleep 200

;      ; 步骤10：拿取背包（原子级慢速拖动）
;     MouseMove 1295, 648
;     Sleep 400
;     Click "Down"
;     ; X轴移动：1295→538 = 每步-75.7像素（取整-76）
;     ; Y轴移动：648→900 = 每步+25.2像素（取整+25）
;     Loop 5 {
;         MouseMove 1295-(A_Index*152), 648+(A_Index*50), 30
;         Sleep 30
;     }
;     Sleep 100
;     Click "Up"
;     Sleep 100

;     ; 关闭背包
;     MouseMove 1770,58
;     Sleep 30
;     Click "Down"
;     Sleep 30
;     Click "Up"
;     Sleep 30

;     ; 按下Alt+Tab组合键
;     Send "{Alt down}"
;     Sleep 30
;     Send "{Tab}"
;     Sleep 30
;     Send "{Alt up}"
;     Sleep 300



;     ; 按下`键
;     Send "``"
;     Sleep 10  ; 增加初始延迟

    
;     isRunning := false
;     Critical false
;     SoundBeep 1500, 200
; }










; 4键触发古法换弹
SetDefaultMouseSpeed 0
CoordMode "Mouse", "Screen"

4:: {
    static isRunning := false
    if isRunning
        return
    
    isRunning := true
    Critical true
    
    ; 步骤1：按下`键
    Send "``"
    Sleep 30  ; 增加初始延迟
    
    ; 步骤2：离开焦点
    MouseMove 961, 540
    Sleep 30  ; 移动后长停顿
    Click
    Sleep 30


    ; 步骤2：离开焦点
    MouseMove 961, 540
    Sleep 30  ; 移动后长停顿
    Click
    Sleep 30
    
    ; 步骤3：打开背包
    MouseMove 157, 973
    Sleep 30  ; 移动后长停顿
    Click
    Sleep 30

    ; 步骤4：古法换子弹
    MouseMove 177, 881
    Sleep 300
    Click "Down"
    Sleep 400
    Loop 5 {
        MouseMove 177+(A_Index*112), 881-(A_Index*120), 30
        Sleep 30
    }
    Sleep 30
    Click "Up"
    Sleep 30



    ; 关闭背包
    MouseMove 1770,58
    Sleep 30
    Click "Down"
    Sleep 30
    Click "Up"
    Sleep 30

    ; 按下Alt+Tab组合键
    Send "{Alt down}"
    Sleep 30
    Send "{Tab}"
    Sleep 30
    Send "{Alt up}"
    Sleep 300



    ; 按下`键
    Send "``"
    Sleep 10  ; 增加初始延迟

    
    isRunning := false
    Critical false
    SoundBeep 1500, 200
}





; 下面是压枪脚本

global startYaQiang := false


; 右Ctrl键切换状态并播放音效(是否开启压枪)
RControl:: {
    global startYaQiang
    startYaQiang := !startYaQiang  ; 切换状态（true ↔ false）

    ; 根据状态播放不同音效
    if startYaQiang {
        SoundPlay "*64"  ; 开始音效（系统通知音）
    } else {
        SoundPlay "*16"  
    }
}


; ==============================
; 核心配置参数
; ==============================
global recoilPattern := [  ; 弹道模式数组（单位：像素）
    [0,2], [0,3], [0,2], [0,3], [0,1], [0,0], [0,1], [0,1], [0,0], [0,1], [0,0], [0,0],   ; 1-6发 (6次)
    [0,1], [0,0], [0,1], [-1,0], [1,0], [-1,0], [1,0], [-1,1], [1,1], [1,0], [1,0], [0,1],   ; 6~12发 
    [0,0], [0,1], [-1,1], [1,1], [-1,1], [0,1], [1,0], [0,1], [0,1], [1,1], [0,1], [-1,1],   ; 12~18发 
    [0,1], [0,1], [0,1], [-1,0], [1,1], [-1,0], [1,1], [-1,1], [0,0], [0,1], [0,1], [0,1],   ; 12~18发 
    [-1,0], [0,1], [0,1], [0,1], [0,1], [1,1], [0,1], [0,1], [0,1], [0,1], [-1,1], [0,1], [0,1], [0,1], [0,1], ; 多压一会，因为这个是循环该数组，不多压几发子弹，会导致重复1~6发的强力压枪
    [-1,1], [0,1], [0,1], [0,1], [0,1], [1,1], [0,1], [0,1], [0,1], [0,1], [-1,1], [0,1], [0,1], [0,1], [0,1] ; 多压一会，因为这个是循环该数组，不多压几发子弹，会导致重复1~6发的强力压枪
]

global currentStep := 1       ; 当前弹道步骤
global isFiring := false      ; 射击状态标识
global CHECK_COLOR := "0xE0E1DF"  ; #DFE1E0的BGR格式
global CHECK_POS_X := 866        ; 检测点X坐标
global CHECK_POS_Y := 970        ; 检测点Y坐标
global variation := 56          ; 70% 偏差（计算方法：255 * 0.7 ≈ 178）


CoordMode "Pixel", "Screen"  ; 设置屏幕绝对坐标

; ==============================
; 主热键控制
; ==============================
~LButton::
{

    if gListenerActive {
        Send "]"        ; 触发右方括号
        StopListener()  ; 立即结束监听
        SoundPlay "*16"  ; 播放结束音效（系统感叹号音）
    }
    
    global isFiring, currentStep
    
    if (startYaQiang && !isFiring && CheckColorCondition(CHECK_POS_X, CHECK_POS_Y, CHECK_COLOR, variation)) {
        isFiring := true
        currentStep := 1
        SetTimer(ApplyRecoil, 25)  ; 直接使用函数名
    }
}

~LButton Up::
{
    global isFiring
    if (isFiring) {
        StopRecoil()
    }
}

; ==============================
; 压枪功能函数
; ==============================
StopRecoil() {
    SetTimer(ApplyRecoil, 0)  ; 通过函数名停止
    global isFiring := false
}

ApplyRecoil() {
    global currentStep, recoilPattern, isFiring
    
    if (currentStep <= recoilPattern.Length) {
        move := recoilPattern[currentStep]
        MouseMove(move[1], move[2], 1, "R")
        currentStep += 1
    } else {
        ; 弹道循环逻辑
        currentStep := 1
    }
    
    ; 自动停止检测
    if (!isFiring) {
        SetTimer(ApplyRecoil, 0)
    }
}

